# Лекция: Jackson и его аннотации для JSON в Java

Jackson предоставляет множество аннотаций, которые позволяют настраивать преобразование объектов в JSON и обратно.

## Аннотация @JsonProperty

Аннотация `@JsonProperty` позволяет указать имя свойства JSON.

```java
public class Product {
    @JsonProperty("product_id")
    private int id;
    @JsonProperty("product_name")
    private String name;
    @JsonProperty("product_price")
    private double price;
    // геттеры и сеттеры
}
```

## Аннотация @JsonIgnore

Аннотация `@JsonIgnore` позволяет исключить свойство из преобразования в JSON.

```java
public class Product {
    private int id;
    private String name;
    @JsonIgnore
    private double price;
    // геттеры и сеттеры
}
```

## Аннотация @JsonFormat

Аннотация `@JsonFormat` позволяет настраивать форматирование свойств.

```java
public class Order {
    private int id;
    private int userId;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
    private LocalDate date;
    // геттеры и сеттеры
}
```

---

# Практические задания

1. **Создайте класс `Product` с полями `id`, `name` и `price`. Используйте аннотацию `@JsonProperty` для указания имен свойств JSON. Преобразуйте объект `Product` в JSON.** (Сложность: 1/5)
```java
public class Product {
    @JsonProperty("product_id")
    private int id;
    @JsonProperty("product_name")
    private String name;
    @JsonProperty("product_price")
    private double price;
    // геттеры и сеттеры
}

Product product = new Product();
product.setId(1);
product.setName("Apple");
product.setPrice(0.99);

ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(product);
System.out.println(json); // выводит {"product_id":1,"product_name":"Apple","product_price":0.99}
```

2. **Преобразуйте JSON в объект `Product`.** (Сложность: 1/5)
```java
String json = "{\"product_id\":1,\"product_name\":\"Apple\",\"product_price\":0.99}";

ObjectMapper objectMapper = new ObjectMapper();
Product product = objectMapper.readValue(json, Product.class);
System.out.println(product.getName()); // выводит "Apple"
```

3. **Создайте класс `Order` с полями `id`, `userId`, `products` (список `Product`) и `date` (дата заказа). Используйте аннотацию `@JsonFormat` для форматирования даты. Преобразуйте объект `Order` в JSON.** (Сложность: 2/5)
```java
public class Order {
    private int id;
    private int userId;
    private List<Product> products;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
    private LocalDate date;
    // геттеры и сеттеры
}

Order order = new Order();
order.setId(1);
order.setUserId(1);
order.setProducts(Arrays.asList(product));
order.setDate(LocalDate.now());

ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(order);
System.out.println(json); // выводит JSON с датой в формате "dd.MM.yyyy"
```

4. **Преобразуйте JSON в объект `Order`.** (Сложность: 2/5)
```java
String json = "{\"id\":1,\"userId\":1,\"products\":[{\"product_id\":1,\"product_name\":\"Apple\",\"product_price\":0.99}],\"date\":\"01.01.2022\"}";

ObjectMapper objectMapper = new ObjectMapper();
Order order = objectMapper.readValue(json, Order.class);
System.out.println(order.getDate()); // выводит 2022-01-01
```

5. **Создайте класс `User` с полями `id`, `name`, `email` и `orders` (список `Order`). Используйте аннотацию `@JsonIgnore` для исключения поля `email` из преобразования в JSON. Преобразуйте объект `User` в JSON и обратно.** (Сложность: 3/5)
```java
public class User {
    private int id;
    private String name;
    @JsonIgnore
    private String email;
    private List<Order> orders;
    // геттеры и сеттеры
}

User user = new User();
user.setId(1);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
user.setOrders(Arrays.asList(order));

ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
System.out.println(json); // выводит JSON без поля "email"

User parsedUser = objectMapper.readValue(json, User.class);
System.out.println(parsedUser.getName()); // выводит "John Doe"
```